Перейти к основному содержимому

Практическое задание 5: C4 Architecture & Database Design

🏗️ Архитектурное проектирование - Создание C4 диаграмм и проектирование базы данных

📋 Описание задания

Создать архитектурную документацию для вашего веб-приложения, используя C4 модель архитектуры. Спроектировать и документировать архитектуру базы данных с помощью ERD диаграмм. Создать полноценную техническую документацию, включающую контекстные диаграммы, диаграммы контейнеров и детальное проектирование БД.

🎯 Цели задания

  • Изучение C4 модели архитектуры
  • Создание архитектурных диаграмм
  • Проектирование структуры базы данных
  • Документирование технических решений
  • Освоение инструментов для создания диаграмм
  • Понимание связей между компонентами системы
  • Развитие архитектурного мышления

📝 Требования к выполнению

Основные требования:

  1. Context Diagram (Level 1) - контекстная диаграмма системы с протоколами
  2. Container Diagram (Level 2) - диаграмма контейнеров с технологиями и портами
  3. ERD (Entity Relationship Diagram) - диаграмма сущностей и связей БД
  4. Database Schema - детальная схема базы данных с индексами
  5. Архитектурная документация - описание принятых решений и протоколов
  6. Инструменты - использование специализированных инструментов для создания диаграмм

C4 Architecture:

  • Context Diagram - показать систему в контексте пользователей и внешних систем
  • Container Diagram - показать высокоуровневую архитектуру с основными контейнерами
  • Документация - описать архитектурные решения и обоснования

Database Design:

  • ERD - показать все сущности, их атрибуты и связи
  • Схема БД - детальные таблицы с полями, типами данных и ограничениями
  • Связи - foreign keys, индексы, триггеры
  • Нормализация - обоснование структуры БД

📊 Система оценивания

  • Полное выполнение: Максимальная оценка (2 балла)
  • Частичное выполнение: Преподаватель дает обратную связь и просит переделать
  • Пересдача: Возможна после исправления замечаний

🛠 Технические требования

C4 Architecture:

Context Diagram (Level 1):

  • Пользователи: веб-пользователи, администраторы, мобильные пользователи
  • Внешние системы: email сервис, платежная система, внешние API, файловое хранилище
  • Основная система: ваше веб-приложение
  • Протоколы: HTTPS, SMTP, REST API
  • Потоки данных: показать основные взаимодействия

Container Diagram (Level 2):

  • Frontend: HTML/CSS/JS, React/Vue
  • Backend API: Node.js/Express, Python/Django, PHP/Laravel
  • Database: PostgreSQL, MySQL, MongoDB
  • Cache: Redis, Memcached
  • Nginx: Reverse proxy, статические файлы
  • External Services: Email, Payment, Storage
  • Протоколы: HTTP/HTTPS, WebSocket, TCP, Database protocols
  • Технологии: указать конкретные технологии для каждого контейнера

Database Design:

ERD:

  • Сущности
  • Связи: one-to-many, many-to-many, one-to-one
  • Атрибуты: поля, типы данных, ограничения
  • Индексы: для производительности

Database Schema:

  • Таблицы: детальная структура с полями
  • Constraints: primary keys, foreign keys, unique constraints
  • Indexes: для оптимизации запросов
  • Протоколы доступа: HTTP/REST, WebSocket, Direct SQL
  • Порты: указать порты для каждого сервиса

🔗 Полезные ресурсы

C4 Architecture:

  • C4 Model - официальная документация C4 модели
  • C4 Model Examples - примеры диаграмм

Database Design:

Инструменты для диаграмм:

📋 Чек-лист выполнения

C4 Architecture:

  • [ ] Создана Context Diagram с пользователями и внешними системами
  • [ ] Указаны протоколы связи (HTTPS, SMTP, REST API)
  • [ ] Создана Container Diagram с основными компонентами
  • [ ] Указаны технологии для каждого контейнера
  • [ ] Указаны порты и протоколы между контейнерами
  • [ ] Документированы архитектурные решения
  • [ ] Обоснован выбор технологий и протоколов

Database Design:

  • [ ] Создан ERD с основными сущностями
  • [ ] Определены связи между сущностями
  • [ ] Создана детальная схема БД
  • [ ] Добавлены индексы для производительности
  • [ ] Обоснована нормализация БД

Документация:

  • [ ] Создана архитектурная документация
  • [ ] Описаны технические решения
  • [ ] Документированы ограничения и компромиссы
  • [ ] Добавлены примеры использования

Инструменты:

  • [ ] Диаграммы экспортированы в удобном формате
  • [ ] Созданы шаблоны для будущего использования
  • [ ] Документация структурирована и читаема

🧪 Тестирование

Обязательные проверки:

  1. Context Diagram - все пользователи и внешние системы учтены, указаны протоколы
  2. Container Diagram - архитектура соответствует реальной системе, указаны технологии и порты
  3. ERD - все сущности и связи корректны, нормализация соблюдена
  4. Database Schema - схема БД детализирована и оптимизирована, есть индексы
  5. Протоколы - все протоколы связи указаны и обоснованы
  6. Документация - все решения обоснованы и задокументированы

Дополнительные проверки:

  • Соответствие C4 модели
  • Качество диаграмм (читаемость, полнота)
  • Производительность БД (индексы, оптимизация)
  • Масштабируемость архитектуры
  • Безопасность решений

🚀 Примеры диаграмм

Context Diagram Example:

graph TB
WebUser[Web User] -->|HTTPS| System[Web Application]
Admin[Admin User] -->|HTTPS| System
Mobile[Mobile User] -->|HTTPS| System
System -->|SMTP| Email[Email Service]
System -->|HTTPS/REST| Payment[Payment Gateway]
System -->|HTTPS/REST| Storage[File Storage]
System -->|HTTPS/REST| External[External APIs]

Container Diagram Example:

graph TB
User[User] -->|HTTPS| Nginx[Nginx<br/>Reverse Proxy<br/>Port 80/443]
Nginx -->|HTTP| Frontend[Frontend<br/>HTML/CSS/JS<br/>React/Vue]
Nginx -->|HTTP/WebSocket| Backend[Backend API<br/>Node.js/Express<br/>Port 3000]
Backend -->|TCP/PostgreSQL| Database[(PostgreSQL<br/>Database<br/>Port 5432)]
Backend -->|TCP/Redis| Redis[(Redis<br/>Cache<br/>Port 6379)]
Backend -->|HTTPS/REST| Email[Email Service<br/>SMTP]
Backend -->|HTTPS/REST| Storage[File Storage<br/>AWS S3]

ERD Example:

-- Пример ERD для чат-приложения с протоколами доступа
Table users {
id integer [primary key]
username varchar(50) [unique, not null]
email varchar(100) [unique, not null]
password_hash varchar(255) [not null]
avatar_url varchar(255)
is_online boolean [default: false]
last_seen timestamp [default: now()]
created_at timestamp [default: now()]
updated_at timestamp [default: now()]

indexes {
username [unique]
email [unique]
is_online
}
}

Table rooms {
id integer [primary key]
name varchar(100) [not null]
description text
created_by integer [ref: > users.id]
is_private boolean [default: false]
max_members integer [default: 100]
created_at timestamp [default: now()]

indexes {
created_by
is_private
}
}

Table messages {
id integer [primary key]
room_id integer [ref: > rooms.id]
user_id integer [ref: > users.id]
message text [not null]
message_type varchar(20) [default: 'text']
reply_to integer [ref: > messages.id]
created_at timestamp [default: now()]
edited_at timestamp
is_deleted boolean [default: false]

indexes {
room_id
user_id
created_at
message_type
}
}

Table user_rooms {
user_id integer [ref: > users.id]
room_id integer [ref: > rooms.id]
joined_at timestamp [default: now()]
role varchar(20) [default: 'member']

indexes {
(user_id, room_id) [unique]
user_id
room_id
}
}